/*
 * @Description: define point type
 * @Autor: Zijie Chen
 * @Date: 2023-12-25 22:28:00
 */

#ifndef POINT_TYPE_H_
#define POINT_TYPE_H_

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <bitset>
using PointType = pcl::PointXYZINormal;
using CloudType = pcl::PointCloud<PointType>;
using CloudPtr = CloudType::Ptr;

  struct Voxel {
    Voxel(){};

    Eigen::Vector3d centorid_ = Eigen::Vector3d::Zero();
    size_t N_{0};
    double max_z{-1000.00};
    double min_z{1000.00};
    size_t maxZ_hash_index_{0};
    size_t minZ_hash_index_{0};
  };
  
//表示带有协方差信息的三维点
struct PointWithCovariance {
  PCL_ADD_POINT4D //为点结构添加四维坐标（x, y, z, 和一个额外的用于度量的值，通常是强度或时间戳）
  int idx;//标识点的索引。这样的设计可以让用户追踪点在原始数据中的位置或顺序
  float cov[6];//存储点的协方差信息。协方差矩阵用于描述数据点的不确定性和相关性
  std::bitset<27> features;
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW  //确保了新分配的内存符合 Eigen 库的对齐要求，以优化性能，避免潜在的内存访问错误
} EIGEN_ALIGN16;  //使用 EIGEN_ALIGN16 强制应用SSE填充，确保在使用 SIMD 指令时内存对齐

//在点云库中注册新的点类型，使得新定义的 PointWithCovariance 结构体可以用于点云操作，如过滤、变换等。这里的每一对参数指定了点的属性及其在结构体中的名称
POINT_CLOUD_REGISTER_POINT_STRUCT(
    PointWithCovariance,
    (float, x, x)(float, y, y)(float, z, z)(int, idx, idx)(float[6], cov, cov))

using PointCovType = PointWithCovariance;
using CloudCovType = pcl::PointCloud<PointWithCovariance>;
using CloudCovPtr = CloudCovType::Ptr;

#endif